package hip.util.json;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;

import java.util.List;

public class Xml2Json {

    /**
     * xml转json
     *
     * @param xmlStr
     * @return
     * @throws DocumentException
     */
    public static JSONObject xml2Json(String xmlStr) throws DocumentException {
        Document doc = DocumentHelper.parseText(xmlStr);
        JSONObject json = new JSONObject();
        xml2Json(doc.getRootElement(), json);
        return json;
    }

    /**
     * xml转json
     *
     * @param element
     * @param json
     */
    @SuppressWarnings("unchecked")
    public static void xml2Json(Element element, JSONObject json) {
        if (element != null) {
            JSONArray jsonArray = new JSONArray();
            JSONObject elementJson = new JSONObject();
            //文本
            if (!isEmpty(element.getText())) {
                elementJson.put("#text", element.getTextTrim());
            }
            //属性
            List<Attribute> attrs = element.attributes();
            if (attrs != null && !attrs.isEmpty()) {
                for (Attribute attr : attrs) {
                    if (!isEmpty(attr.getValue())) {
                        elementJson.put("@" + attr.getName(), attr.getValue());
                    }
                }
            }
            if (!elementJson.isEmpty()) {
                jsonArray.add(elementJson);
            }
            //子节点
            List<Element> childElements = element.elements();
            if (!childElements.isEmpty()) {//如果没有子节点,只有一个值
                for (Element childElement : childElements) {//有子元素
                    JSONObject childElementJson = new JSONObject();
                    xml2Json(childElement, childElementJson);
                    if (!childElementJson.isEmpty()) {
                        jsonArray.add(childElementJson);
                    }
                }
            }
            //最后
            if (!jsonArray.isEmpty()) {
                json.put(element.getName(), jsonArray);
            }
        }
    }


    /**
     * xml转json
     *
     * @param element
     * @param json
     */
    @SuppressWarnings("unchecked")
    public static void xml2JsonExpand(Element element, JSONObject json) {
        if (element != null) {
            //属性
            List<Attribute> attrs = element.attributes();
            if (attrs != null && !attrs.isEmpty()) {
                for (Attribute attr : attrs) {
                    if (!isEmpty(attr.getValue())) {
                        json.put("@" + attr.getName(), attr.getValue());
                    }
                }
                //文本
                if (!isEmpty(element.getText())) {
                    json.put("#text", element.getTextTrim());
                }
            }

            //子节点
            List<Element> childElements = element.elements();
            if (!childElements.isEmpty()) {//如果没有子节点,只有一个值
                for (Element childElement : childElements) {//有子元素
                    JSONObject childElementJson = new JSONObject();
                    xml2JsonExpand(childElement, childElementJson);
                    if (childElementJson.isEmpty()) {
                        if (!isEmpty(childElement.getText())) {
                            json.put(childElement.getName(), childElement.getTextTrim());
                        }
                    } else {
                        if (json.get(childElement.getName()) == null) {
                            json.put(childElement.getName(), childElementJson);
                        } else {
                            JSONArray array = new JSONArray();
                            if (json.get(childElement.getName()) instanceof JSONObject) {
                                array.add(json.get(childElement.getName()));
                                array.add(childElementJson);
                            } else if (json.get(childElement.getName()) instanceof JSONArray) {
                                array.addAll((JSONArray) json.get(childElement.getName()));
                                array.add(childElementJson);
                            }

                            json.put(childElement.getName(), array);
                        }
                    }
                }
            }
        }
    }

    private static boolean isEmpty(String str) {
        if (str == null || str.trim().isEmpty() || "null".equals(str)) {
            return true;
        }
        return false;
    }
}

